package com.t.bricks.bussiness.controller.orderscomment;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.t.bricks.bussiness.controller.common.BaseController;
import com.t.bricks.bussiness.db.entity.orderscomment.OrdersComment;
import com.t.bricks.bussiness.service.orderscomment.OrdersCommentService;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.utils.modules.web.FindByPageParam;
import com.t.bricks.utils.spring.ModuleUtil;

/**
 * 订单评论控制层
 * 继承BaseController可直接实现通用方法,三个泛型代表:业务类、实体类、查询类
 * 通用业务类CommonService已经包含常用功能,使用自定义OrdersCommentService(需实现)可覆盖通用方法或扩展业务功能
 * 通用查询类可以直接使用Map,否则使用自定义ConditionOrdersComment(需实现)
 * @author HuangXinBian
 * @DateTime 2022年06月22日 15:25:30
 */
@RestController
@Api(value="订单评论", tags={"订单评论操作接口"})
@RequestMapping("/orders/comment/")
public class OrdersCommentController extends BaseController<OrdersCommentService<OrdersComment>, OrdersComment, Map<String, Object>> {
	
	/**
	 * 控制操作,首位9不参与用6个数代表开关,0为不限制,1为限制
	 * 6个数的控制分别是:删除、修改、查询、导出、统计、步骤值可逆
	 * 其中前5个为'是否仅创建者可操作'后续为其它控制开关
	 */
	protected int enableTag = 9110111;

	/**
	 * 设置 检查待新增内容是否存在重复数据(多字段组合重复即重复)集合
	 * @return 返回的集合将覆盖父类的checkRepeatCombination成员,若返回null则不进行重复校验
	 */
	@Override
	protected List<String> setCheckRepeatCombination() {
		return Arrays.asList("sOrderId", "sWaresId");
	}

	/**
	 * 设置 检查待新增内容是否存在重复数据(单独字段重复即重复)集合
	 * @return 返回的集合将覆盖父类的checkRepeatAlone成员,若返回null则不进行重复校验
	 */
	@Override
	protected Map<String, Integer> setCheckRepeatAlone() {
		return null;
	}

	/**
	 * 删除数据
	 * @param iVersion
	 * @param id 记录编号
	 * @return MsgEmity
	 */
	@RequestMapping(method={RequestMethod.POST}, value="/del")
	@Override
	public MsgEmity del(Integer iVersion, String id) {
		return super.del(iVersion, id);//直接使用父类中定义的方法,否则使用ordersCommentService.del(iVersion, sId);
	}

	/**
	 * 新增数据
	 * @param ordersComment 订单评论实体对象
	 * @return MsgEmity
	 */
	@ApiOperation(value="新增数据", response=OrdersComment.class)
	@RequestMapping(method={RequestMethod.POST}, value="/add")
	@Override
	public MsgEmity add(@RequestBody OrdersComment ordersComment) {
		return this.service().addCustom(ordersComment);
	}

	/**
	 * 修改数据
	 * @param ordersComment 订单评论实体对象
	 * @return MsgEmity
	 */
	@ApiOperation(value="修改数据", response=OrdersComment.class)
	@RequestMapping(method={RequestMethod.POST}, value="/edit")
	@Override
	public MsgEmity edit(@RequestBody OrdersComment ordersComment) {
		return this.service().editCustom(ordersComment);//直接使用父类中定义的方法,否则使用ordersCommentService.edit(ordersComment);
	}

	/**
	 * 根据记录编号查询符合分页数据的某条记录
	 * @param id 记录编号
	 * @return MsgEmity
	 */
	@ApiOperation(value="根据记录编号查询符合分页数据的某条记录", response=OrdersComment.class)
	@RequestMapping(method={RequestMethod.POST}, value="/find/page/row")
	@Override
	public MsgEmity findByPageRow(String id) {
		return super.findByPageRow(id);//直接使用父类中定义的方法,否则使用ordersCommentService.findByPageRow(id);
	}

	/**
	 * 查询分页数据
	 * @param findByPageParam 分页查询条件组合类
	 * 结构参考: {"page": 分页请求信息对象, "orders": 排序信息对象集合, "sLikeStr": 全文检索, "condition": 查询条件对象}
	 * @return MsgEmity 返回查询结果
	 */
	@ApiOperation(value="查询分页数据", response=OrdersComment.class)
	@RequestMapping(method={RequestMethod.POST}, value="/find/page")
	@Override
	public MsgEmity findByPage(@RequestBody FindByPageParam<Map<String, Object>> findByPageParam) {//findByPage(@RequestBody FindByPageParam<ConditionOrdersComment> findByPageParam)
		return super.findByPage(findByPageParam);//直接使用父类中定义的方法,否则使用 ordersCommentService.findByPage(findByPageParam.getPage(), findByPageParam.getOrders(), findByPageParam.getsLikeStr(), findByPageParam.getCondition());
	}

	//---------------------------- 自动生成代码结束 ----------------------------//

	/**
	 * 读取文件列表(评论者用)
	 * @param uId 记录编号
	 * @param request
	 * @param response
	 */
	@ApiOperation(value="读取文件列表", notes="评论者用")
	@RequestMapping(method=RequestMethod.GET, value="/file/list")
	public MsgEmity fileList(String uId) {
		MsgEmity me = super.service().getValueByFieldName(uId, "sOrderId,sCreator".split(","), false);
		if (!me.isSuccess()) {
			return me;
		}

		OrdersComment ordersComment = me.getData();
		
		return super.fileTree(String.format("/%s/%s/", ordersComment.getsCreator(), ordersComment.getsOrderId()));
	}

	/**
	 * 文件上传(评论者用)
	 * @param file 文件
	 * @param uId 记录编号
	 * @param sFileName 存储的文件名
	 * @param iCover 是否覆盖(1:是;2:否)
	 * @return
	 */
	@ApiOperation(value="文件上传", notes="评论者用")
	@ApiImplicitParams({
		@ApiImplicitParam(name="file", value="文件", dataType="__file", paramType="form", required=true),
		@ApiImplicitParam(name="sOrderId", value="订单编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sFileName", value="存储的文件名", dataType="String", paramType="query", required=false),
		@ApiImplicitParam(name="iCover", value="是否覆盖(1:是;2:否)", dataType="String", paramType="query", required=false)
	})
	@RequestMapping(method=RequestMethod.POST, value="/file/up")
	public MsgEmity upFile(@RequestParam("file") MultipartFile file,
			String sOrderId, String sFileName, Integer iCover) {
		String sUserId = ModuleUtil.currentLoginUserId();//只能上传到自己目录
		
		String sPath = String.format("/%s/%s/", sUserId, sOrderId.trim());
		
		return super.upFile(file, sPath, sFileName, iCover);
	}

	/**
	 * 下载文件
	 * @param sPath 存储路径(含文件名的相对路径)
	 * @param request
	 * @param response
	 */
	@ApiOperation(value="下载文件", notes="公用,但仅限评论区文件")
	@RequestMapping(method=RequestMethod.GET, value="/file/down")
	public void download(String sPath,
			HttpServletRequest request, HttpServletResponse response) {
		super.download(sPath, request, response);//路径做了处理,只局限于"/OrdersComment/"路径下
	}

	/**
	 * 查询商品的评价
	 * @param sWaresId 商品编号
	 * @param iSize 记录条数
	 * @return MsgEmity 返回查询结果
	 */
	@ApiOperation(value="查询分页数据", response=OrdersComment.class)
	@RequestMapping(method={RequestMethod.POST}, value="/find/wares")
	public MsgEmity findBysWaresId(String sWaresId, Integer iSize) {
		if (null == sWaresId || "".equals(sWaresId.trim())) {
			return MsgEmity.err(9001, "商品编号为空");
		}

		if (null == iSize || iSize.intValue() < 0) {
			return MsgEmity.err(9002, "数量参数应大于0");
		}
		
		return super.callMapping(sWaresId, iSize);
	}
	
	/**
	 * 查询订单下各个商品的评价检验值
	 * @param sOrderId 订单编号
	 * @return
	 */
	@ApiOperation(value="查询订单下各个商品的评价检验值", notes="码值标识1111,分别代表:当前用户订单状态6/是否当前用户订单/期限内订单/已经评论")
	@RequestMapping(method={RequestMethod.POST}, value="/find/check")
	public MsgEmity findOrderCheck(String sOrderId) {
		return this.service().findOrderCheck(sOrderId);
	}
	
	
	
	
	/**
	 * 测试多条评论
	 * @param sOrderId 订单编号
	 * @return
	 */
	@ApiOperation(value="测试")
	@RequestMapping(method={RequestMethod.POST}, value="/test")
	public MsgEmity test() {
		String[] array = {"0000000000000000000000000000022","0000000000000000000000000000018", "0000000000000000000000000000012", "0000000000000000000000000000008",
				"0000000000000000000000000000002", "0000000000000000000000000000007"};
		
		for (String string : array) {
			OrdersComment ordersComment = new OrdersComment();
			ordersComment.setsOrderId("000000196");
			ordersComment.setsWaresId(string);
			ordersComment.setsCustomerAliases("18587897049");
			ordersComment.setsCommentImgs("U2i.jpg;");
			ordersComment.setsCustomerPhoto("");
			ordersComment.setiGrade(5);
			ordersComment.setsComment("真的很喜欢，完全超出期望值，发货速度非常快，包装非常仔细、严实，运送速度很快，没办法外包装占地方只能拆了拍了！很满意的");
			ordersComment.setsMemo("b019;26.8;二级肉广壹加跑山猪散养土猪羌香纯粮猪肉");
			MsgEmity me = this.service().addCustom(ordersComment);
			System.out.println(me.getMsg());
		}
		
		return MsgEmity.success("测试结束");
	}
	
}
